#include <bits/stdc++.h>
using namespace std;

/*
3228. 将 1 移动到末尾的最大操作次数
已解答
中等
相关标签
premium lock icon
相关企业
提示
给你一个 二进制字符串 s。

你可以对这个字符串执行 任意次 下述操作：

选择字符串中的任一下标 i（ i + 1 < s.length ），该下标满足 s[i] == '1' 且 s[i + 1] == '0'。
将字符 s[i] 向 右移 直到它到达字符串的末端或另一个 '1'。例如，对于 s = "010010"，如果我们选择 i = 1，结果字符串将会是 s = "000110"。
返回你能执行的 最大 操作次数。

 

示例 1：

输入： s = "1001101"

输出： 4

解释：

可以执行以下操作：

选择下标 i = 0。结果字符串为 s = "0011101"。
选择下标 i = 4。结果字符串为 s = "0011011"。
选择下标 i = 3。结果字符串为 s = "0010111"。
选择下标 i = 2。结果字符串为 s = "0001111"。
示例 2：

输入： s = "00111"

输出： 0

 

提示：

1 <= s.length <= 105
s[i] 为 '0' 或 '1'。
*/

// 法一
class Solution {
public:
    int maxOperations(string s) {
        int before = 0;  // 记录当前连续1的个数
        int cnt = 0;     // 总操作数（1→0的有效转换次数总和）
        bool flag = true;    // 标记是否可触发统计（1=可触发，0=不可）
        for (char i : s) {
            if (i == '0' && flag) {
                cnt += before;
                flag = false;
            } 
            // catch 1 update
            else if (i == '1') {
                before++;
                flag = true;
            }
        }
        
        return cnt;
    }
};

// 法二
class Solution {
public:
    int maxOperations(string s) {
        int n = s.size();
        int ans = 0, cnt1 = 0;
        for (int i = 0; i < n; i++) {
            if (s[i] == '1')  cnt1++;
            else if (i > 0 && s[i - 1] == '1')  ans += cnt1;
        }
        return ans;
    }
};